Sponsored Content
Top Forums Programming read() blocks process until the stream is closed Post 302389680 by jens.g on Monday 25th of January 2010 01:46:14 PM
Old 01-25-2010
read() blocks process until the stream is closed

Hi @all,

i really stuck in programming a tool with bidirectional process communication (popen(cmd, "rw") ... something like that ;-)).

Here is the code:

Code:
  if(pipe(p_stdin) != 0 || pipe(p_stdout) != 0) {
    fprintf(stderr, "Aufruf von pipe() schlug fehl.\n");
    exit(1);
  }

  if((pid = fork()) < 0) {
    fprintf(stderr, "Aufruf von fork() schlug fehl.\n");
    exit(1);

  // kinderprozess
  } else if(pid == 0) {
    close(p_stdin[WRITE]);
    dup2(p_stdin[READ], READ);
    close(p_stdout[READ]);
    dup2(p_stdout[WRITE], WRITE);

    // factor aurufen
    execl("/bin/sh", "sh", "-c", "factor", NULL);
    perror("execl");
    exit(1);
  }

  close(p_stdin[READ]);
  close(p_stdout[WRITE]);

  // zahlen einlesen
  do {
    assert(fgets(buf, 128, stdin) != NULL);
    
    if((number = atoi(buf)) > 0) {
      // zahl an factor übergeben
      buf[length = strlen(buf)] = '\n';
      assert(write(p_stdin[WRITE], buf, length + 1) != -1);

      // ergebniss auslesen
      close(p_stdin[WRITE]); // <- this musst be removed
      assert(read(p_stdout[READ], buf, 128) != -1);
      printf("Die Zufallszahl %d hat die Primfaktoren %s", number, buf + length + 1);
    }
  } while(number > 0);

intersting are only the last 10 lines. I try to write to factor, then read, than write again (...) until 0 is given. This wont work, because read(p_stdout[READ], ....) always blocks the programm, waiting for some better waeather are someso. I tried to use fsync() between write and read, but it didnt help. Only fclose() solve the problem, but if p_stdin[WRITE] is closed, i can only iterate the loop one times.

Can someone help me? Thx :-)
 

10 More Discussions You Might Find Interesting

1. UNIX for Advanced & Expert Users

Stream Read And Write Queues

Is there any possibility that a Stream Read and Write queues will interchange messages of any kind. If so what are the different possiblites and under what circumstances ? Thanks in advance. (4 Replies)
Discussion started by: S.P.Prasad
4 Replies

2. Programming

How to know a new file is in process of creating? It has not been closed.

I am programming some data loader of oracle with unix c, when I find new data file, then read it to database and delete it. but one issue, if the file is in process of creating, not been closed yet. I will read zero or part of data content, this will cause problem. I want to know whether some unix... (2 Replies)
Discussion started by: linkjack
2 Replies

3. UNIX for Dummies Questions & Answers

ssh_exchange_identification: Connection closed by remote host Connection closed

Hi Everyone, Good day. Scenario: 2 unix servers -- A (SunOS) and B (AIX) I have an ftp script to sftp 30 files from A to B which happen almost instantaneously i.e 30 sftp's happen at the same time. Some of these sftp's fail with the following error: ssh_exchange_identification: Connection... (1 Reply)
Discussion started by: jeevan_fimare
1 Replies

4. Programming

read input-process-output

Can you help me ? I want to write a program ,which can open a input file (input.txt) and run as child process ,then write to output file (output.txt)....... char inFile="input.txt"; char outFile="output.txt"; int main(int argc, char **argv) { pid_t pid=1; int no=0; // no. of... (5 Replies)
Discussion started by: cupid1575
5 Replies

5. Shell Programming and Scripting

How to read text in blocks

Hi, I have file which contains information written in blocks (every block is different). Is it possible to read every block one by one to another file (one block per file). The input is something like this <block1> <empty line> <block2> <empty line> ... ... ... <block25> <empty... (0 Replies)
Discussion started by: art84_)LV
0 Replies

6. Shell Programming and Scripting

[Video stream] network stream recording with mplayer

Hi I used this command: mplayer http://host/axis-cgi/mjpg/video.cgi -user root -passwd root \ -cache 1024 -fps 25.0 -nosound -vc ffh264 \ -demuxer 3 -dumpstream -dumpfile output.avi It's ok but... Video Playing is very fast! Why? Is it a synch problem? What parameter I have to use for... (1 Reply)
Discussion started by: takeo.kikuta
1 Replies

7. UNIX for Dummies Questions & Answers

Convert 512-blocks to 4k blocks

I'm Unix. I'm looking at "df" on Unix now and below is an example. It's lists the filesystems out in 512-blocks, I need this in 4k blocks. Is there a way to do this in Unix or do I manually convert and how? So for container 1 there is 7,340,032 in size in 512-blocks. What would the 4k block be... (2 Replies)
Discussion started by: rockycj
2 Replies

8. Shell Programming and Scripting

how to split this file into blocks and then send these blocks as input to the tool called Yices?

Hello, I have a file like this: FILE.TXT: (define argc :: int) (assert ( > argc 1)) (assert ( = argc 1)) <check> # (define c :: float) (assert ( > c 0)) (assert ( = c 0)) <check> # now, i want to separate each block('#' is the delimeter), make them separate files, and then send them as... (5 Replies)
Discussion started by: paramad
5 Replies

9. UNIX for Dummies Questions & Answers

Read data from given filename or stream

I have a script that takes 2 parameters (say) as mandatory script1.sh a b The 3rd parameter can be filename which it should process or it can come through a pipeline stream The script should work both ways: script1.sh a b filec or cat filec | script1.sh a b How to put logic in the... (1 Reply)
Discussion started by: ysrini
1 Replies

10. Shell Programming and Scripting

Row blocks to column blocks

Hello, Searched for a while and found some "line-to-column" script. My case is similar but with multiple fields each row: S02 Length Per S02 7043 3.864 S02 54477 29.89 S02 104841 57.52 S03 Length Per S03 1150 0.835 S03 1321 0.96 S03 ... (9 Replies)
Discussion started by: yifangt
9 Replies
shmctl(2)							   System Calls 							 shmctl(2)

NAME
shmctl - shared memory control operations SYNOPSIS
#include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int shmctl(int shmid, int cmd, struct shmid_ds *buf); DESCRIPTION
The shmctl() function provides a variety of shared memory control operations as specified by cmd. The permission required for a shared mem- ory control operation is given as {token}, where token is the type of permission needed. The types of permission are interpreted as fol- lows: 00400 READ by user 00200 WRITE by user 00040 READ by group 00020 WRITE by group 00004 READ by others 00002 WRITE by others See the Shared Memory Operation Permissions section of intro(2) for more information. The following operations require the specified tokens: IPC_STAT Place the current value of each member of the data structure associated with shmid into the structure pointed to by buf. The contents of this structure are defined in intro(2). {READ} IPC_SET Set the value of the following members of the data structure associated with shmid to the corresponding value found in the structure pointed to by buf: shm_perm.uid shm_perm.gid shm_perm.mode /* access permission bits only */ This command can be executed only by a process that has appropriate privileges or an effective user ID equal to the value of shm_perm.cuid or shm_perm.uid in the data structure associated with shmid. IPC_RMID Remove the shared memory identifier specified by shmid from the system. The segment referenced by the identifier will be destroyed when all processes with the segment attached have either detached the segment or exited. If the segment is not attached to any process when IPC_RMID is invoked, it will be destroyed immediately. This command can be executed only by a process that has appropriate privileges or an effective user ID equal to the value of shm_perm.cuid or shm_perm.uid in the data structure associated with shmid. SHM_LOCK Lock the shared memory segment specified by shmid in memory. This command can be executed only by a process that has appro- priate privileges. SHM_UNLOCK Unlock the shared memory segment specified by shmid. This command can be executed only by a process that has appropriate privileges. A shared memory segment must be explicitly removed using IPC_RMID before the system can deallocate it and the resources it uses. RETURN VALUES
Upon successful completion, 0 is returned. Otherwise, -1 is returned and errno is set to indicate the error. ERRORS
The shmctl() function will fail if: EACCES The cmd argument is equal to IPC_STAT and {READ} operation permission is denied to the calling process. EFAULT The buf argument points to an illegal address. EINVAL The shmid argument is not a valid shared memory identifier; or the cmd argument is not a valid command or is IPC_SET and shm_perm.uid or shm_perm.gid is not valid. ENOMEM The cmd argument is equal to SHM_LOCK and there is not enough memory. EOVERFLOW The cmd argument is IPC_STAT and uid or gid is too large to be stored in the structure pointed to by buf. EPERM The cmd argument is equal to IPC_RMID or IPC_SET, the effective user ID of the calling process is not equal to the value of shm_perm.cuid or shm_perm.uid in the data structure associated with shmid, and {PRIV_IPC_OWNER} is not asserted in the effective set of the calling process. The cmd argument is equal to SHM_LOCK or SHM_UNLOCK and {PRIV_PROC_LOCK_MEMORY} is not asserted in the effective set of the calling process. ATTRIBUTES
See attributes(5) for descriptions of the following attributes: +-----------------------------+-----------------------------+ | ATTRIBUTE TYPE | ATTRIBUTE VALUE | +-----------------------------+-----------------------------+ |Interface Stability |Standard | +-----------------------------+-----------------------------+ SEE ALSO
ipcs(1), intro(2), shmget(2), shmop(2), attributes(5), privileges(5), standards(5) SunOS 5.10 1 Feb 2003 shmctl(2)
All times are GMT -4. The time now is 08:11 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy